'use strict';

const Controller = require('egg').Controller;

// 基础Controller 封装一些方法，可以让其他的Controller去集成从而获得通用的处理结果的返回方法
// 建议所有的Controller 集成这个方法，做通用的返回值处理
class BaseController extends Controller {

  // 200服务器回应
  success({ data, msg, code }) {
    this.ctx.status = 200;
    this.ctx.body = {
      success: true,
      msg: msg || '成功',
      code: code ? code : 0,
      data,
    };
  }

  // 204服务器回应 No Content 表示请求已成功处理，但是没有内容返回（就应该没有内容返回的状态）
  success204() {
    this.ctx.status = 204;
  }

  // 206服务器回应 Partial Content 表示服务器已经完成了部分GET请求
  success206({ data, msg, code }) {
    this.ctx.status = 206;
    this.ctx.body = {
      success: true,
      msg: msg || '部分成功',
      code: code ? code : 0,
      data,
    };
  }

  // 400服务器回应 Bad Request 表示请求报文存在语法错误或参数错误，服务器不理解
  httpError400({ data, msg, code }) {
    this.ctx.status = 400;
    this.ctx.body = {
      success: false,
      msg: msg || 'Bad Request',
      code: code ? code : 0,
      data,
    };
  }

  // 401服务器回应 Unauthorized 表示发送的请求需要有HTTP认证或者认证失败了
  httpError401({ data, msg, code }) {
    this.ctx.status = 401;
    this.ctx.body = {
      success: false,
      msg: msg || 'Unauthorized',
      code: code ? code : 0,
      data,
    };
  }

  // 403服务器回应 Forbidden 表示请求资源的访问被服务器拒绝了
  httpError403({ data, msg, code }) {
    this.ctx.status = 403;
    this.ctx.body = {
      success: false,
      msg: msg || 'Forbidden',
      code: code ? code : 0,
      data,
    };
  }

  // 404服务器回应 Not Found 表示服务器找不到你请求的资源了
  httpError404({ data, msg, code }) {
    this.ctx.status = 404;
    this.ctx.body = {
      success: false,
      msg: msg || 'Not Found',
      code: code ? code : 0,
      data,
    };
  }

  // 500服务器回应 Tnternal Server Error 表示服务器执行请求的时候出错了
  httpError500({ data, msg, code }) {
    this.ctx.status = 500;
    this.ctx.body = {
      success: false,
      msg: msg || 'Tnternal Server Error',
      code: code ? code : 0,
      data,
    };
  }

  // 503服务器回应 Service Unavailable 表示服务器超负荷或正停机维护
  httpError503({ data, msg, code }) {
    this.ctx.status = 503;
    this.ctx.body = {
      success: false,
      msg: msg || 'Service Unavailable',
      code: code ? code : 0,
      data,
    };
  }
}

module.exports = BaseController;
